<?php
	/*
	 * Ustawianie include_path.
	 *
	 * Katalogi z modelami są includowane później, w pluginie Smart_ModelLoader.
	 *
	 * Wykonanie tej operacji z poziomu PHP gwarantuje
	 * użycie prawidłowych separatorów ścieżek (Windows/Linux).
	 */
	set_include_path(
		'.' . PATH_SEPARATOR .
		'../libs/' . PATH_SEPARATOR .  								// biblioteki
		'../application/modules/' . PATH_SEPARATOR .  				// moduły
		'../application/modules/default/models/' . PATH_SEPARATOR .  				// modele	
		'../acl/' . PATH_SEPARATOR .								// acl'e
		get_include_path()
	);

	error_reporting( E_ALL & ~E_NOTICE );
	
    /*
     * Pakowanie danych przed wysłaniem do klienta
     */
    ob_start("ob_gzhandler");


    /*
     * Automatyczne załadowanie wszystkich klas aplikacji (Zend, Smart i inne)
     */
    require_once 'Zend/Loader.php';
    Zend_Loader::registerAutoload();


    /*
     * USTAWIENIA PLIKÓW KONFIGURACYJNYCH
     */
    // Utworzenie wszystkich potrzebnych danych konfiguracyjnych...
    $oGeneralConfig = 	new Zend_Config_Ini( '../config/general.ini', 'general' );	// ogólne
    $oDefaultConfig = 	new Zend_Config_Ini( '../config/default.ini', 'config' );	// typowe ustawienia
    $oDbConfig 		= 	new Zend_Config_Ini( '../config/db.ini', 'database' );		// baza danych
    $oRoutesConfig 	= 	new Zend_Config_Ini( '../config/routes.ini', 'routes' );   	// routery
    $oPathsConfig 	= 	new Zend_Config_Ini( '../config/paths.ini', 'paths' );		// ścieżki
    $oDevelConfig 	= 	new Zend_Config_Ini( '../config/devel.ini', 'settings' ); 	// wer. robocza

    // ... i zapisanie ich w rejestrze
    Zend_Registry::set( 'generalConfig', $oGeneralConfig );
    Zend_Registry::set( 'defaultConfig', $oDefaultConfig );
    Zend_Registry::set( 'dbConfig', $oDbConfig );
    Zend_Registry::set( 'routesConfig', $oRoutesConfig );
    Zend_Registry::set( 'pathsConfig', $oPathsConfig );
    Zend_Registry::set( 'develConfig', $oDevelConfig );

    // Przypisanie nazwy projektu do zmiennej, bo będzie jeszcze wyrzkostywana
    $sNazwaProjektu = $oGeneralConfig->nazwaProjektu;


    /*
     * USTAWIENIA BAZY DANYCH
     */
    // Cache
    $oFrontendOptions = array( 'automatic_serialization' => true );
    $oBackendOptions  = array( 'cache_dir' => $oPathsConfig->cache . '/db' );
    $oDbCache = Zend_Cache::factory( 'Core', 'File', $oFrontendOptions, $oBackendOptions );

    // Czyszczenie cache'u bazy w warunkach produkcyjnych
    if( $oDevelConfig->development ) $oDbCache->clean();

    // Utworzenie obiektu reprezentującego bazę danych
    $oDb = Zend_Db::factory( $oDbConfig->db->adapter, $oDbConfig->db->config->toArray() );
    Zend_Db_Table::setDefaultAdapter( $oDb );
    Zend_Db_Table_Abstract::setDefaultMetadataCache( $oDbCache );
    $oDb->setFetchMode( Zend_Db::FETCH_OBJ );

    // Utworzenie obiektu profilera bazy danych - wymaga FireBuga z FirePHP
    if( $oDevelConfig->development )
    {
	    $oProfiler = new Zend_Db_Profiler_Firebug( 'Zapytania do bazy danych' );
	    $oProfiler->setEnabled( true );
		$oDb->setProfiler( $oProfiler );
    }

    // Zapisz do rejestru
	Zend_Registry::set( 'db', $oDb );


	/*
	 * SESJA
	 */
	Zend_Session::start();

    
    /*
     * CACHE GLOBALNY
     */
	// Tworzenie cache'u do przechowywania praktycznie dowolnej zawartości
	// (przede wszystkim wyniki działania metod)
    $aFrontendOptions = array( 'automatic_serialization' => true );
    $aBackendOptions = array( 'cache_dir' => $oPathsConfig->cache . '/general' );
    $oGlobalCache = Zend_Cache::factory( 'Core', 'File', $aFrontendOptions, $aBackendOptions );

    // Czyszczenie cache'u warunkach produkcyjnych
    if( $oDevelConfig->development ) $oGlobalCache->clean();

    // Zapisz do rejestru
    Zend_Registry::set( 'globalCache', $oGlobalCache );


    /*
     * Ładowanie ACL'i
     */
    AclControllerAction::loadAcl();
	
    /*
     * Ścieżka do Action Helperów
     */
    Zend_Controller_Action_HelperBroker::addPath( '../libs/' . $sNazwaProjektu . '/Controller/Action/Helper/', $sNazwaProjektu . '_Controller_Action_Helper' );
    Zend_Controller_Action_HelperBroker::addPath( '../libs/My/Controller/Action/Helper/', 'My_Controller_Action_Helper' );


    /*
     * Wykorzystanie Zend Layout do renderowania widoków - konfiguracja
     */
    $oLayout = Zend_Layout::startMvc( array(
    									'layoutPath' => '../application/modules/default/layouts',
    									'layout' => 'default'
    								) );
    								
	$oLayoutPlugin = new My_Plugin_Layout();
	//$oLayoutPlugin->registerModuleLayout( 'admin', '../application/modules/admin/layouts');


	/*
     * FRONT CONTROLLER
     */
	// Pobieranie instancji
    $oFront = Zend_Controller_Front::getInstance();
    $oFront->addModuleDirectory( '../application/modules/' );
	    

    /*
     * Obsługa danych zalogowanych użytkowników
     */
    $oSesja = new Zend_Session_Namespace( 'zalogowanyUzytkownik' );
    $oSesja->unlock();
	if(!isset($oSesja->oUzytkownik)) $oSesja->oUzytkownik = new Gosc();
	$oSesja->lock(); 
    
    // Rejestracja używanych pluginów
    $oFront->registerPlugin( new My_Plugin_ModelLoader() );				// include_path dla modułów
    $oFront->registerPlugin( new My_Plugin_ErrorControllerSelector() );	// errorController dla modułów
    //$oFront->registerPlugin( new My_Plugin_User() );					// user    
    $oFront->registerPlugin( new My_Plugin_SprawdzUprawnienia() );		// acl'e
	$oFront->registerPlugin( $oLayoutPlugin );							// layouty dla modułów

	

	
    /*
     * Wczytanie ustawien Routerów
     */
    $oRouter = $oFront->getRouter();
    $oRouter->addConfig( $oRoutesConfig );

    /*
     * Tworzenie i konfigurowanie Zend_View
     */
    $oView = new Zend_View();

    // Ustawienia widoków
    $oView->setEncoding( 'UTF-8' );
    $oView->doctype( 'XHTML1_STRICT' );

    // Określenie ścieżek dostępu do katalogów z Helperami - helpery dedykowane, a potem nasze
    $oView->addHelperPath( '../libs/' . $sNazwaProjektu . '/View/Helper/', $sNazwaProjektu . '_View_Helper' );
    $oView->addHelperPath( '../libs/My/View/Helper/', 'My_View_Helper' );

    // Ścieżki do widoków dla helperów - wszystko w katalogu default, bo same helpery też nie przynależą do modułów
    $oView->addScriptPath('../application/modules/default/views/scripts/');
    $oView->addScriptPath('../application/modules/default/views/helpers/');
       
    //Ustawienie odpowiedniego helpera
    //$oView->setEscape( array( 'My_View_Helper_Escape', 'escape' ) );

    //Obiekt nawigatora
    $oView->n = new My_View_Nawigator();
    $oView->n->dodaj( array( 'nazwa' => $oGeneralConfig->nazwaStrony, 'link' => '/' ) );
    

    // Ustaw widok dla layoutu
    $oLayout->setView( $oView );
    
     
    // Utwórz viewRenderer - renderowanie widoków akcji i helperów
    $oViewRenderer = new Zend_Controller_Action_Helper_ViewRenderer($oView);
	$oViewRenderer->setViewBasePathSpec( '../application/modules/:module/views/' )
					->setViewScriptPathSpec( ':controller/:action.:suffix' )
					->setViewScriptPathNoControllerSpec( 'helpers/' )
					->setViewSuffix( 'phtml' );
	Zend_Controller_Action_HelperBroker::addHelper( $oViewRenderer );
        
    /*
     * Wyświetlenie strony
     */
    $oFront->dispatch();


    /*
     * Zakończenie pakowania danych i wysłanie ich do klienta
     */
    ob_end_flush();
?>